﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.ObjectBuilder2;
using PharmacyBussinesEntities;

namespace PharmacyRepositoy
{
    public class ProductoRepository : MasterRepository, IProductoRepository
    {
        public List<Producto> GetAllFromProductos()
        {
            var query = from p in Context.Productos
                        .Include("Categoria")
                        .Include("Laboratorio")
                        .Include("UnidadMedida")
                        .Include("Presentacion")
                        //.Include("Lote")
                select p;
            return query.ToList();

        }

        public List<Producto> GetFromProductosByCriterio(string criterio)
        {
            var query = from p in Context.Productos
                        .Include("Categoria")
                        .Include("Laboratorio")
                        .Include("UnidadMedida")
                        .Include("Presentacion")
                        //.Include("Lote")
                        select p;
            if (criterio != null && criterio != string.Empty)
            {
                query = from p in query
                    where p.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          p.Categoria.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          p.Laboratorio.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          p.UnidadMedida.Nombre.ToUpper().Contains(criterio.ToUpper()) 
                          
                    select p;
            }
            return query.ToList();
        }

        public List<Producto> GetFromProdutoByCanjeAndCriterio(string criterio)
        {
            var fechaHoy = DateTime.Today;
                
            var query = from p in Context.Productos
                        .Include("Categoria")
                        .Include("Laboratorio")
                        .Include("UnidadMedida")
                        .Include("Presentacion")
                        //.Include("Lote")
                        //where p.Lote.FechaCanje.Equals(fechaHoy)
                        select p;
            if (criterio != null && criterio != string.Empty)
            {
                query = from p in query
                        .Include("Laboratorio")
                        .Include("UnidadMedida")
                        .Include("Categoria")
                        .Include("Presentacion")
                       // .Include("Lote")
                    where p.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          p.Categoria.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          p.Laboratorio.Nombre.ToUpper().Contains(criterio.ToUpper()) ||
                          
                          p.UnidadMedida.Nombre.ToUpper().Contains(criterio.ToUpper())//||
                         // p.Lote.FechaCanje.Equals(fechaHoy)
                    select p;
            }
            return query.ToList();
        }

        public Producto GetFromProductoById(int id)
        {
            var query = from p in Context.Productos
                        
                where p.Id.Equals(id)
                select p;
            return query.SingleOrDefault();

        }

        public void AddProducto(Producto producto)
        {
            Context.Productos.Add(producto);
            Context.SaveChanges();
        }

        public void UpdateProducto(Producto producto)
        {
            Context.Entry(producto).State = EntityState.Modified;
            Context.SaveChanges();
        }

        public void RemoveProducto(int id)
        {
            var existe = Context.Productos.Find(id);

            if (existe != null)
            {
                Context.Productos.Remove(existe);
                Context.SaveChanges();
            }
        }


        public int ExisteProductoByCanje()
        {
            var fechaHoy = DateTime.Today;
            var query = from p in Context.Productos
                        .Include("Categoria")
                        .Include("Laboratorio")
                        .Include("UnidadMedida")
                        .Include("Presentacion")
                        //.Include("Lote")
                        //where p.Lote.FechaCanje.Equals(fechaHoy)
                        select p;
            return query.Count();
        }

        public bool ExistProductForChange()
        {
            var datechange = DateTime.Today.AddMonths(6);

            //cambiar p.lote.Fecha with p.lote.datechange
            var query = from p in Context.Productos.Include("Lote")
               // where p.Lote.FechaCanje <= datechange
                select p;

            return query.Any();
        }
    }
}
